package com.cmsz.xpay.common.util;

import java.nio.charset.Charset;
import java.util.Map;

import org.apache.commons.codec.digest.DigestUtils;

/**
 * MD5签名工具，默认编码为UTF-8
 * 
 * @author liyuanchang 2016.3.31
 */
public class MD5SignUtil {
	

	private static final String UTF_8 = "UTF-8";

	/**
	 * 对字符串以指定编码方式进行MD5签名
	 * 
	 * @param str
	 *            待签名字符串
	 * @param charsetName
	 *            字符集
	 * @return MD5签名字符串(小写)
	 */
	public static String md5Sign(String str, String charsetName) {
		byte[] b = str.getBytes(Charset.forName(charsetName));
		String sign = DigestUtils.md5Hex(b);
		return sign;
	}

	/**
	 * 对字符串以UTF-8进行MD5签名
	 * 
	 * @param str
	 *            待签名字符串
	 * @return MD5签名字符串(小写)
	 */
	public static String md5Sign(String str) {
		return md5Sign(str, UTF_8);
	}

	/**
	 * 将map中元素的key值按升序排序为"key1=value1&key2=value2…key"的方式签名
	 * 
	 * @param map
	 *            key-value对
	 * @param key
	 *            拼接到待签名串后面
	 * @param charsetName
	 *            字符集
	 * @return MD5签名字符串(小写)
	 */
	public static String md5Sign(Map<String, String> map, String key, String charsetName) {
		String str = KeyValueUtil.mapToString(map);
		//拼接key
		str += key;
		return md5Sign(str, charsetName);
	}

	/**
	 * 将map中元素的key值按升序排序为"key1=value1&key2=value2…key"的方式签名
	 * 
	 * @param map
	 *            key-value对
	 * @return MD5签名字符串(小写)
	 */
	public static String md5Sign(Map<String, String> map, String key) {
		return md5Sign(map, key, UTF_8);
	}

	/**
	 * MD5验签，大小写不敏感
	 * 
	 * @param str
	 *            待验签字符串
	 * @param verifySign
	 *            待验签签名
	 * @param charsetName
	 *            字符集
	 * @return 是否验签通过
	 */
	public static boolean md5verify(String str, String verifySign, String charsetName) {
		String sign = md5Sign(str, charsetName);
		if (verifySign.equalsIgnoreCase(sign)) {
			return true;
		}
		return false;
	}

	/**
	 * MD5验签，大小写不敏感
	 * 
	 * @param str
	 *            待验签字符串
	 * @param verifySign
	 *            待验签签名
	 * @return 是否验签通过
	 */
	public static boolean md5verify(String str, String verifySign) {
		return md5verify(str, verifySign, UTF_8);
	}

	/**
	 * 将map中元素的key值按升序排序为"key1=value1&key2=value2…key"的方式签名后验签，大小写不敏感
	 * 
	 * @param map
	 *            key-value对
	 * @param key
	 *            拼接到待签名串后面
	 * @param verifySign
	 *            待验签签名
	 * @param charsetName
	 *            字符集
	 * @return 是否验签通过
	 */
	public static boolean md5verify(Map<String, String> map, String key, String verifySign, String charsetName) {
		String sign = md5Sign(map, key, charsetName);
		if (verifySign.equalsIgnoreCase(sign)) {
			return true;
		}
		return false;
	}

	/**
	 * 将map中元素的key值按升序排序为"key1=value1&key2=value2…key"的方式签名后验签，大小写不敏感
	 * 
	 * @param map
	 *            key-value对
	 * @param key
	 *            拼接到待签名串后面
	 * @param verifySign
	 *            待验签签名
	 * @return 是否验签通过
	 */
	public static boolean md5verify(Map<String, String> map, String key, String verifySign) {
		return md5verify(map, key, verifySign, UTF_8);
	}
}
